﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


    public  class BitsHelp : IBitsHelper
    {
        /// <summary>
        /// 从十六进制字符串中根据指定的位范围获取位值
        /// </summary>
        public ulong GetBits(string str, string num)
        {
            var temp = Convert.ToUInt32(num, 16);
            ulong rtemp = 0;
            // 根据位范围解析并获取相应的位值
            //switch (str)
            //{
        
            //}
            return rtemp;
        }

        /// <summary>
        /// 将指定的值设置到指定的十六进制字符串中的位
        /// </summary>
        public ulong SetBitsToUint(string bits, string hex, string val)
        {
            var valTemp = Convert.ToUInt32(val, 16);
            var bitsTemp = bits.Replace("[", "").Replace("]", "").Split(':');
            int min = bitsTemp.Min(c => int.Parse(c));
            return valTemp >> min & Convert.ToUInt32(hex, 16);
        }

        /// <summary>
        /// 获取指定位范围的值并转换为无符号整数
        /// </summary>
        public long GetBitsToUint(string bits, string hex, string val)
        {
            var valTemp = Convert.ToUInt32(val, 16);
            var bitsTemp = bits.Replace("[", "").Replace("]", "").Split(':');
            int min = bitsTemp.Min(c => int.Parse(c));
            return (valTemp >> min) & Convert.ToUInt32(hex, 16);
        }

        /// <summary>
        /// 根据检查标志设置位并返回无符号整数
        /// </summary>
        public ulong SetBitsCheckedToUint(string bits, string hex, string val, bool isCheck)
        {
            var valTemp = Convert.ToUInt32(val, 16);
            var hexTemp = Convert.ToUInt32(hex, 16);
            return isCheck ? (valTemp | hexTemp) : (valTemp & (hexTemp ^ 0xff));
        }

        /// <summary>
        /// 根据位和十六进制字符串的值判断位是否被设置
        /// </summary>
        public long GetBitsCheckedToBool(string bits, string hex, string val)
        {
            var valTemp = Convert.ToUInt32(val, 16);
            var hexTemp = Convert.ToUInt32(hex, 16);
            return ((valTemp & hexTemp) == hexTemp) ? 0 : 1;
        }

        /// <summary>
        /// 根据位范围和位宽生成位掩码
        /// </summary>
        public string GetBitsToMask(string bits, string bitWide, List<string> bList)
        {
            string maskStr = "";
            double bitNo = 2;
            List<string> blArr = new List<string>();
            // 解析 bList，识别位范围
            for (int i = 0; i < bList.Count; i++)
            {
                var blTemp = bList[i].Replace("[", "").Replace("]", "").Split(':');
                blArr.AddRange(blTemp);
            }
            int max = blArr.Max(c => int.Parse(c));
            int min = blArr.Min(c => int.Parse(c));
            bitNo = Math.Ceiling(((max - min) + 1) / 4.0);
            bitNo += (bitNo % 2);
            maskStr = @"[0-9a-fA-F]{1," + $"{(int)bitNo}" + "}";
            return maskStr;
        }
    public int GetBitsMaxLength(List<string> bList)
    {
        // 解析 bList，找到所有位范围的最小值和最大值
        var bitRanges = bList.Select(br =>
        {
            var parts = br.Trim('[', ']').Split(':');
            int start = int.Parse(parts[0]);
            int end = int.Parse(parts[1]);
            return Tuple.Create(start, end); // 使用 Tuple 替代 ValueTuple
        }).ToList();

        int minBit = bitRanges.Min(range => range.Item2); // 使用 Item2 访问 end
        int maxBit = bitRanges.Max(range => range.Item1); // 使用 Item1 访问 start

        // 计算需要的十六进制位数（每4位二进制表示一个十六进制字符）
        int bitNo = (int)Math.Ceiling((maxBit - minBit + 1.0) / 4.0);

        // 如果需要的话，将 bitNo 调整为偶数（这一步的逻辑取决于您的具体需求）
        if (bitNo % 2 != 0)
        {
            bitNo++;
        }

        return bitNo;
    }

}


